home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
DEMON
/
RISCOS2
/
TCP_131S.ARC
/
c
/
window
< prev
Wrap
Text File
|
1994-03-07
|
8KB
|
432 lines
#define EXPRO 0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <signal.h>
#include "akbd.h"
#if EXPRO
#include "exprofle.h"
#endif
#include "wimpt.h"
#include "res.h"
#include "resspr.h"
#include "template.h"
#include "dbox.h"
#include "flex.h"
#include "heap.h"
#include "kernel.h"
#include "event.h"
#include "visdelay.h"
#include "baricon.h"
#include "menu.h"
#include "saveas.h"
#include "werr.h"
#include "wimp.h"
#include "win.h"
#include "alarm.h"
#include "global.h"
#include "config.h"
#include "cmdparse.h"
#include "misc.h"
#include "driver.h"
#include "Terminal.h"
#define Icon_Menu_Info 1
#define Icon_Menu_Quit 2
Terminal *MWin = NULL;
Terminal *TWin = NULL;
static BOOL Trace_Window_Open = FALSE;
static menu Icon_Menu;
static int doscale(int, char **);
static int dostatus(int, char **);
static int doterminal(int, char **);
static void Icon_MenuProc(void *, char *);
static void Icon_Click(wimp_i);
static void Alarm_Handler(int, void *);
static void Signal_Proc(int);
int term_type = -1;
int32 wimp_ver;
static char term_name[12];
static int (*terminal_driver)(int,...);
extern int (*pipe_load(char *))(int,...);
extern char version[];
extern char arc_vs[];
extern char compile_date[];
extern char startup[];
extern BOOL scale;
static struct cmds wincmds[] = {
"scale", doscale, 0, NULLCHAR, NULLCHAR,
"status", dostatus, 0, NULLCHAR, NULLCHAR,
"terminal", doterminal, 0, NULLCHAR, NULLCHAR,
NULLCHAR,
};
int dowin(int argc, char **argv)
{
return subcmd(wincmds, argc, argv);
}
int doterminal(int argc, char **argv)
{
int ports, loop;
if (argc == 1)
{
cwprintf(NULL, "Using %s terminal", term_type < 0 ? "internal" : "external");
if (term_type != -1)
cwprintf(NULL, " with %s driver\r\n", term_name);
else
cwprintf(NULL, "\r\n");
}
else
{
if (argc > 1 && strnlcmp(argv[1], "external", MIN(strlen(argv[1]), 8)) == 0)
{
terminal_driver = pipe_load(argv[2]);
ports = ((int *) terminal_driver)[49];
for (loop = 0; loop < ports / 0x1000000; loop++)
(terminal_driver)(DRIVER_INITIALISE, loop);
term_type = 0;
strcpy(term_name, argv[2]);
Window_Close(MWin);
Window_Close(TWin);
}
if (strnlcmp(argv[1], "internal", MIN(strlen(argv[1]), 8)) == 0)
{
wimp_wstate state;
wimp_get_wind_state(MWin->Window_Handle, &state);
wimp_open_wind(&state.o);
term_type = -1;
}
cwprintf(NULL, "KA9Q Internet Protocol Package, v%s\r\n", version);
cwprintf(NULL, "Original program copyright 1988 by Phil Karn, KA9Q\r\n");
cwprintf(NULL, "NET/ROM support copyright 1989 by Dan Frank, W9NK\r\n") ;
cwprintf(NULL, "Original Acorn Archimedes port by Jonathan Naylor, G4KLX\r\n");
cwprintf(NULL, "Further work by Anthony Frost, Thomas Aeby and Andrew Draper\r\n");
cwprintf(NULL, "\r\nThis is Arc version %s, compiled %s\r\n\r\n", arc_vs, __DATE__);
}
return(FALSE);
}
static int doscale(int argc, char **argv)
{
if (argc == 1)
{
cwprintf(NULL, "scaling is %s\r\n", (scale) ? "on" : "off");
}
else
{
if (stricmp(argv[1], "on") == 0)
{
scale = TRUE;
}
else
{
scale = FALSE;
}
}
return 0;
}
static int dostatus(int argc, char **argv)
{
argc = argc;
argv = argv;
cwprintf(NULL, "trace window: status:%s\r\n", (Trace_Window_Open) ? "open" : "closed");
return(0);
}
int main(int argc, char **argv)
{
#if EXPRO
exprofle_init("<TCPIP$Dir>.profile");
#endif
wimp_ver = wimpt_init("TCP/IP");
res_init("TCPIP");
flex_init();
_kernel_register_slotextend(flex_budge);
resspr_init();
template_init();
dbox_init();
visdelay_init();
alarm_init();
argc = argc;
argv = argv;
signal(SIGABRT, Signal_Proc);
signal(SIGFPE, Signal_Proc);
signal(SIGILL, Signal_Proc);
signal(SIGINT, Signal_Proc);
signal(SIGSEGV, Signal_Proc);
signal(SIGTERM, Signal_Proc);
signal(SIGSTAK, Signal_Proc);
signal(8, Signal_Proc);
signal(9, Signal_Proc);
visdelay_begin();
if ((Icon_Menu = menu_new("TCP/IP", ">Info,Quit")) == NULL)
{
visdelay_end();
return(1);
}
baricon("!tcpip", (int)resspr_area(), Icon_Click);
if (!event_attachmenu(win_ICONBAR, Icon_Menu, Icon_MenuProc, 0))
{
visdelay_end();
return(1);
}
wimp_save_fp_state_on_poll();
if (TWin = Window_Open(NULL, "Trace Window", term_DONT_OPEN | term_DONT_DESTROY | term_NO_INPUT), TWin == NULL)
{
visdelay_end();
return(1);
}
Window_Close(TWin);
if (MWin = Window_Open(NULL, "TCPIP Command Window", term_CARET | term_DONT_DESTROY), MWin == NULL)
{
visdelay_end();
return(1);
}
net_init();
visdelay_end();
alarm_set(alarm_timenow() + 1, Alarm_Handler, 0);
while (TRUE)
event_process();
return(0);
}
static void Icon_MenuProc(void *Handle, char *Hit)
{
char buffer[50];
dbox d;
Handle = Handle;
switch (Hit[0])
{
case Icon_Menu_Info:
if ((d = dbox_new("progInfo")) == NULL)
return;
sprintf(buffer, "%s %s", arc_vs, compile_date);
dbox_setfield(d, 4, buffer);
dbox_show(d);
dbox_fillin(d);
dbox_dispose(&d);
break;
case Icon_Menu_Quit:
net_exit();
default:
break;
}
}
static void Icon_Click(wimp_i Icon)
{
wimp_wstate state;
Icon = Icon;
if (term_type == -1)
{
wimp_get_wind_state(MWin->Window_Handle, &state);
wimp_open_wind(&state.o);
}
}
static void Alarm_Handler(int Time, void *Handle)
{
int c;
Handle = Handle;
Time = Time;
if (term_type != -1)
{
while (c = (terminal_driver)(DRIVER_GETBYTE, 0x00), c >= 0)
net_keyboard(c);
}
net_poll();
alarm_set(alarm_timenow() + 1, Alarm_Handler, 0);
}
void cwputs(Terminal *port, char *s)
{
if (term_type == -1)
{
Window_Write((port ? port : MWin), s, strlen(s));
}
else
{
while(*s)
(terminal_driver)(DRIVER_PUTBYTE, 0x00, *s++);
}
}
int cwprintf(Terminal *port, char *fmt, ...)
{
va_list args;
static char Buffer[1000];
int cnt;
va_start(args, fmt);
cnt = vsprintf(Buffer, fmt, args);
va_end(args);
cwputs(port, Buffer);
return(cnt);
}
int cwputchar(Terminal *port, int c)
{
if (term_type == -1)
{
if (port)
Window_Write(port, (char *) &c, 1);
else
Window_Write(MWin, (char *) &c, 1);
}
else
{
(terminal_driver)(DRIVER_PUTBYTE, 0x00, c);
}
return(c);
}
int cwtitle(Terminal *port, char *fmt, ...)
{
va_list args;
static char Buffer[100];
int cnt;
va_start(args, fmt);
cnt = vsprintf(Buffer, fmt, args);
va_end(args);
if (port)
win_settitle(port->Window_Handle, Buffer);
else
win_settitle(MWin->Window_Handle, Buffer);
return(cnt);
}
void twopen(void)
{
if (!Trace_Window_Open)
{
wimp_wstate state;
wimp_get_wind_state(TWin->Window_Handle, &state);
wimp_open_wind(&state.o);
Trace_Window_Open = TRUE;
}
}
void twclose(void)
{
Window_Close(TWin);
Trace_Window_Open = FALSE;
}
void twputs(char *s)
{
Window_Write(TWin, s, strlen(s));
}
int twprintf(char *fmt, ...)
{
va_list args;
static char Buffer[1000];
int cnt;
va_start(args, fmt);
cnt = vsprintf(Buffer, fmt, args);
va_end(args);
twputs(Buffer);
return(cnt);
}
int twputchar(int c)
{
Window_Write(TWin, (char *) &c, 1);
return(c);
}
void panic(char *fmt, ...)
{
static char Buffer[500];
va_list args;
va_start(args, fmt);
vsprintf(Buffer, fmt, args);
va_end(args);
werr(TRUE, Buffer);
}
static void Signal_Proc(int Signal)
{
switch (Signal)
{
case SIGABRT:
werr(TRUE, "Abort signal received");
break;
case SIGFPE:
werr(TRUE, "Arithmetic exception");
break;
case SIGILL:
werr(TRUE, "Illegal instruction");
break;
case SIGINT:
werr(TRUE, "Attention requested from user");
break;
case SIGSEGV:
werr(TRUE, "Bad memory access");
break;
case SIGTERM:
werr(TRUE, "Termination request");
break;
case SIGSTAK:
werr(TRUE, "Stack overflow");
break;
default:
werr(TRUE, "Signal number %d", Signal);
break;
}
}